home *** CD-ROM | disk | FTP | other *** search
/ Macwelt 1 / Macwelt DVD 1.toast / Software für Mac-OS X / Entwickler-Tools / netbeans / modules / ext / djava.jar / koala / dynamicjava / interpreter / context / GlobalContext.class (.txt) < prev    next >
Encoding:
Java Class File  |  2000-03-14  |  15.5 KB  |  497 lines

  1. package koala.dynamicjava.interpreter.context;
  2.  
  3. import java.lang.reflect.AccessibleObject;
  4. import java.lang.reflect.Constructor;
  5. import java.lang.reflect.Field;
  6. import java.lang.reflect.InvocationTargetException;
  7. import java.lang.reflect.Member;
  8. import java.lang.reflect.Method;
  9. import java.lang.reflect.Modifier;
  10. import java.util.Iterator;
  11. import java.util.LinkedList;
  12. import java.util.List;
  13. import java.util.Map;
  14. import java.util.Set;
  15. import koala.dynamicjava.classinfo.JavaClassInfo;
  16. import koala.dynamicjava.interpreter.ClassLoaderContainer;
  17. import koala.dynamicjava.interpreter.Interpreter;
  18. import koala.dynamicjava.interpreter.NodeProperties;
  19. import koala.dynamicjava.interpreter.TreeCompiler;
  20. import koala.dynamicjava.interpreter.error.CatchedExceptionError;
  21. import koala.dynamicjava.interpreter.error.ExecutionError;
  22. import koala.dynamicjava.interpreter.modifier.FinalVariableModifier;
  23. import koala.dynamicjava.interpreter.modifier.InvalidModifier;
  24. import koala.dynamicjava.interpreter.modifier.LeftHandSideModifier;
  25. import koala.dynamicjava.interpreter.modifier.ObjectFieldModifier;
  26. import koala.dynamicjava.interpreter.modifier.StaticFieldModifier;
  27. import koala.dynamicjava.interpreter.modifier.VariableModifier;
  28. import koala.dynamicjava.interpreter.throwable.ThrownException;
  29. import koala.dynamicjava.tree.ArrayInitializer;
  30. import koala.dynamicjava.tree.ArrayType;
  31. import koala.dynamicjava.tree.ClassAllocation;
  32. import koala.dynamicjava.tree.ClassDeclaration;
  33. import koala.dynamicjava.tree.ConstructorDeclaration;
  34. import koala.dynamicjava.tree.ConstructorInvocation;
  35. import koala.dynamicjava.tree.Expression;
  36. import koala.dynamicjava.tree.FieldDeclaration;
  37. import koala.dynamicjava.tree.FormalParameter;
  38. import koala.dynamicjava.tree.Identifier;
  39. import koala.dynamicjava.tree.IdentifierToken;
  40. import koala.dynamicjava.tree.MethodDeclaration;
  41. import koala.dynamicjava.tree.Node;
  42. import koala.dynamicjava.tree.ObjectFieldAccess;
  43. import koala.dynamicjava.tree.QualifiedName;
  44. import koala.dynamicjava.tree.ReferenceType;
  45. import koala.dynamicjava.tree.SimpleAllocation;
  46. import koala.dynamicjava.tree.SimpleAssignExpression;
  47. import koala.dynamicjava.tree.StaticFieldAccess;
  48. import koala.dynamicjava.tree.StringLiteral;
  49. import koala.dynamicjava.tree.SuperFieldAccess;
  50. import koala.dynamicjava.tree.TreeUtilities;
  51. import koala.dynamicjava.tree.TypeDeclaration;
  52. import koala.dynamicjava.tree.TypeExpression;
  53. import koala.dynamicjava.util.AmbiguousFieldException;
  54. import koala.dynamicjava.util.BufferedImportationManager;
  55. import koala.dynamicjava.util.ImportationManager;
  56. import koala.dynamicjava.util.ReflectionUtilities;
  57.  
  58. public class GlobalContext extends VariableContext implements Context {
  59.    protected static final ReferenceType CLASS_TYPE = new ReferenceType("java.lang.Class");
  60.    protected static final ReferenceType MAP_TYPE = new ReferenceType("java.util.Map");
  61.    protected static final ReferenceType OBJECT_TYPE = new ReferenceType("java.lang.Object");
  62.    protected static final ArrayType OBJECT_ARRAY_ARRAY;
  63.    protected static final TypeExpression OBJECT_CLASS;
  64.    protected static final String LOCALS_NAME = "local$Variables$Reference$0";
  65.    protected static final FieldDeclaration LOCALS;
  66.    protected static int classCount;
  67.    protected ImportationManager importationManager;
  68.    protected Interpreter interpreter;
  69.    protected ClassLoader classLoader;
  70.    protected ClassLoaderContainer clc;
  71.    protected List functions = new LinkedList();
  72.    // $FF: synthetic field
  73.    private static Class class$Ljava$lang$Object;
  74.    // $FF: synthetic field
  75.    private static Class class$Ljava$util$Map;
  76.  
  77.    public void setAdditionalClassLoaderContainer(ClassLoaderContainer var1) {
  78.       this.clc = var1;
  79.    }
  80.  
  81.    protected ClassLoader getAdditionalClassLoader() {
  82.       return this.clc != null ? this.clc.getClassLoader() : null;
  83.    }
  84.  
  85.    public void setFunctions(List var1) {
  86.       this.functions = var1;
  87.    }
  88.  
  89.    public List getFunctions() {
  90.       return this.functions;
  91.    }
  92.  
  93.    public Interpreter getInterpreter() {
  94.       return this.interpreter;
  95.    }
  96.  
  97.    public ImportationManager getImportationManager() {
  98.       return this.importationManager;
  99.    }
  100.  
  101.    public void setImportationManager(ImportationManager var1) {
  102.       this.importationManager = var1;
  103.    }
  104.  
  105.    public boolean exists(String var1) {
  106.       return this.isDefined(var1) || this.classExists(var1);
  107.    }
  108.  
  109.    public boolean classExists(String var1) {
  110.       boolean var2 = false;
  111.       ImportationManager var10000 = this.importationManager;
  112.       PseudoClassLoader var10001 = new PseudoClassLoader;
  113.       if (this == null) {
  114.          throw null;
  115.       } else {
  116.          var10001.<init>(this);
  117.          var10000.setClassLoader(var10001);
  118.  
  119.          try {
  120.             this.lookupClass(var1);
  121.             var2 = true;
  122.          } catch (ClassNotFoundException var10) {
  123.          } catch (PseudoError var11) {
  124.             var2 = true;
  125.          } finally {
  126.             if (this.classLoader == null) {
  127.                this.importationManager.setClassLoader(this.interpreter.getClassLoader());
  128.             } else {
  129.                this.importationManager.setClassLoader(this.classLoader);
  130.             }
  131.  
  132.          }
  133.  
  134.          return var2;
  135.       }
  136.    }
  137.  
  138.    public void defineFunction(MethodDeclaration var1) {
  139.       this.functions.add(0, var1);
  140.    }
  141.  
  142.    public void defineClass(TypeDeclaration var1) {
  143.       (new TreeCompiler(this.interpreter)).compileTree(this, var1);
  144.    }
  145.  
  146.    public boolean isDefined(String var1) {
  147.       return ((VariableContext)this).isDefinedVariable(var1);
  148.    }
  149.  
  150.    public void setCurrentPackage(String var1) {
  151.       this.importationManager.setCurrentPackage(var1);
  152.    }
  153.  
  154.    public String getCurrentPackage() {
  155.       return this.importationManager.getCurrentPackage();
  156.    }
  157.  
  158.    public void declarePackageImport(String var1) {
  159.       this.importationManager.declarePackageImport(var1);
  160.    }
  161.  
  162.    public void declareClassImport(String var1) throws ClassNotFoundException {
  163.       ImportationManager var10000 = this.importationManager;
  164.       PseudoClassLoader var10001 = new PseudoClassLoader;
  165.       if (this == null) {
  166.          throw null;
  167.       } else {
  168.          var10001.<init>(this);
  169.          var10000.setClassLoader(var10001);
  170.  
  171.          try {
  172.             this.importationManager.declareClassImport(var1);
  173.          } catch (PseudoError var7) {
  174.          } finally {
  175.             if (this.classLoader == null) {
  176.                this.importationManager.setClassLoader(this.interpreter.getClassLoader());
  177.             } else {
  178.                this.importationManager.setClassLoader(this.classLoader);
  179.             }
  180.  
  181.          }
  182.  
  183.       }
  184.    }
  185.  
  186.    public Node getDefaultQualifier(Node var1) {
  187.       return this.getDefaultQualifier(var1, "");
  188.    }
  189.  
  190.    public Node getDefaultQualifier(Node var1, String var2) {
  191.       return null;
  192.    }
  193.  
  194.    public LeftHandSideModifier getModifier(QualifiedName var1) {
  195.       return (LeftHandSideModifier)(((VariableContext)this).isFinal(var1.getRepresentation()) ? new FinalVariableModifier(var1, NodeProperties.getType(var1)) : new VariableModifier(var1, NodeProperties.getType(var1)));
  196.    }
  197.  
  198.    public LeftHandSideModifier getModifier(ObjectFieldAccess var1) {
  199.       Field var2 = (Field)var1.getProperty("field");
  200.       return (LeftHandSideModifier)(var2.isAccessible() ? new ObjectFieldModifier(var2, var1) : new InvalidModifier(var1));
  201.    }
  202.  
  203.    public LeftHandSideModifier getModifier(StaticFieldAccess var1) {
  204.       Field var2 = (Field)var1.getProperty("field");
  205.       return (LeftHandSideModifier)(var2.isAccessible() ? new StaticFieldModifier(var2, var1) : new InvalidModifier(var1));
  206.    }
  207.  
  208.    public LeftHandSideModifier getModifier(SuperFieldAccess var1) {
  209.       throw new IllegalStateException("internal.error");
  210.    }
  211.  
  212.    public Object getHiddenArgument() {
  213.       return null;
  214.    }
  215.  
  216.    public Expression createName(Node var1, IdentifierToken var2) {
  217.       if (!this.isDefined(var2.image())) {
  218.          throw new IllegalStateException();
  219.       } else {
  220.          LinkedList var3 = new LinkedList();
  221.          var3.add(var2);
  222.          return new QualifiedName(var3);
  223.       }
  224.    }
  225.  
  226.    public Class lookupClass(String var1) throws ClassNotFoundException {
  227.       return this.importationManager.lookupClass(var1, (String)null);
  228.    }
  229.  
  230.    public Class lookupClass(String var1, String var2) throws ClassNotFoundException {
  231.       return this.importationManager.lookupClass(var1, var2);
  232.    }
  233.  
  234.    public Class setProperties(SimpleAllocation var1, Class var2, Class[] var3) {
  235.       Object var4 = null;
  236.  
  237.       try {
  238.          var7 = this.lookupConstructor(var2, var3);
  239.       } catch (Exception var6) {
  240.          throw new CatchedExceptionError(var6, var1);
  241.       }
  242.  
  243.       var1.setProperty("type", var2);
  244.       var1.setProperty("constructor", var7);
  245.       return var2;
  246.    }
  247.  
  248.    public Class setProperties(ClassAllocation var1, Class var2, Class[] var3, List var4) {
  249.       String var5 = "TopLevel" + "$" + classCount++;
  250.       FieldDeclaration var6 = new FieldDeclaration(25, CLASS_TYPE, "declaring$Class$Reference$0", OBJECT_CLASS);
  251.       var4.add(var6);
  252.       var4.add(LOCALS);
  253.       var6 = new FieldDeclaration(25, OBJECT_ARRAY_ARRAY, "local$Variables$Class$0", this.createClassArrayInitializer());
  254.       var4.add(var6);
  255.       LinkedList var8 = new LinkedList();
  256.       LinkedList var9 = new LinkedList();
  257.       var8.add(new FormalParameter(false, MAP_TYPE, "param$0"));
  258.       LinkedList var10 = new LinkedList();
  259.  
  260.       for(int var11 = 0; var11 < var3.length; ++var11) {
  261.          var8.add(new FormalParameter(false, TreeUtilities.classToType(var3[var11]), "param$" + (var11 + 1)));
  262.          LinkedList var12 = new LinkedList();
  263.          var12.add(new Identifier("param$" + (var11 + 1)));
  264.          var10.add(new QualifiedName(var12));
  265.       }
  266.  
  267.       ConstructorInvocation var23 = null;
  268.       if (var10.size() > 0) {
  269.          var23 = new ConstructorInvocation((Expression)null, var10, true);
  270.       }
  271.  
  272.       LinkedList var24 = new LinkedList();
  273.       var24.add(new Identifier("local$Variables$Reference$0"));
  274.       LinkedList var13 = new LinkedList();
  275.       var13.add(new Identifier("param$0"));
  276.       var9.add(new SimpleAssignExpression(new QualifiedName(var24), new QualifiedName(var13)));
  277.       ConstructorDeclaration var7 = new ConstructorDeclaration(1, var5, var8, new LinkedList(), var23, var9);
  278.       var4.add(var7);
  279.       LinkedList var14 = null;
  280.       LinkedList var15 = null;
  281.       if (var2.isInterface()) {
  282.          var15 = new LinkedList();
  283.          LinkedList var16 = new LinkedList();
  284.          var16.add(new Identifier(var2.getName()));
  285.          var15.add(var16);
  286.       } else {
  287.          var14 = new LinkedList();
  288.          var14.add(new Identifier(var2.getName()));
  289.       }
  290.  
  291.       ClassDeclaration var25 = new ClassDeclaration(1, var5, var14, var15, var4);
  292.       ((TypeDeclaration)var25).setProperty("anonymousDeclaringClass", new JavaClassInfo(class$Ljava$lang$Object != null ? class$Ljava$lang$Object : (class$Ljava$lang$Object = class$("java.lang.Object"))));
  293.       Class var17 = (new TreeCompiler(this.interpreter)).compileTree(this, var25);
  294.       Class[] var18 = new Class[var3.length + 1];
  295.       var18[0] = class$Ljava$util$Map != null ? class$Ljava$util$Map : (class$Ljava$util$Map = class$("java.util.Map"));
  296.  
  297.       for(int var19 = 1; var19 < var18.length; ++var19) {
  298.          var18[var19] = var3[var19 - 1];
  299.       }
  300.  
  301.       var3 = var18;
  302.  
  303.       try {
  304.          var1.setProperty("constructor", this.lookupConstructor(var17, var3));
  305.       } catch (NoSuchMethodException var20) {
  306.          var20.printStackTrace();
  307.       }
  308.  
  309.       var1.setProperty("type", var17);
  310.       return var17;
  311.    }
  312.  
  313.    protected ArrayInitializer createClassArrayInitializer() {
  314.       LinkedList var1 = new LinkedList();
  315.       ReferenceType var3 = new ReferenceType((class$Ljava$lang$Object != null ? class$Ljava$lang$Object : (class$Ljava$lang$Object = class$("java.lang.Object"))).getName());
  316.       Map var4 = ((VariableContext)this).getConstants();
  317.  
  318.       for(String var6 : var4.keySet()) {
  319.          LinkedList var7 = new LinkedList();
  320.          var7.add(new StringLiteral('"' + var6 + '"'));
  321.          Class var8 = (Class)var4.get(var6);
  322.          var7.add(new TypeExpression(TreeUtilities.classToType(var8)));
  323.          ArrayInitializer var2 = new ArrayInitializer(var7);
  324.          var2.setElementType(var3);
  325.          var1.add(var2);
  326.       }
  327.  
  328.       ArrayType var9 = new ArrayType(var3, 1);
  329.       ArrayInitializer var10 = new ArrayInitializer(var1);
  330.       var10.setElementType(var9);
  331.       return var10;
  332.    }
  333.  
  334.    public Constructor lookupConstructor(Class var1, Class[] var2) throws NoSuchMethodException {
  335.       Constructor var3 = ReflectionUtilities.lookupConstructor(var1, var2);
  336.       this.setAccessFlag(var3);
  337.       return var3;
  338.    }
  339.  
  340.    public Object invokeConstructor(SimpleAllocation var1, Object[] var2) {
  341.       Constructor var3 = (Constructor)var1.getProperty("constructor");
  342.  
  343.       try {
  344.          return var3.newInstance(var2);
  345.       } catch (InvocationTargetException var5) {
  346.          if (var5.getTargetException() instanceof Error) {
  347.             throw (Error)var5.getTargetException();
  348.          } else if (var5.getTargetException() instanceof RuntimeException) {
  349.             throw (RuntimeException)var5.getTargetException();
  350.          } else {
  351.             throw new ThrownException(var5.getTargetException());
  352.          }
  353.       } catch (Exception var6) {
  354.          throw new CatchedExceptionError(var6, var1);
  355.       }
  356.    }
  357.  
  358.    public Object invokeConstructor(ClassAllocation var1, Object[] var2) {
  359.       Constructor var3 = (Constructor)var1.getProperty("constructor");
  360.       Object[] var4 = new Object[var2.length + 1];
  361.       var4[0] = ((VariableContext)this).getConstants();
  362.  
  363.       for(int var5 = 1; var5 < var4.length; ++var5) {
  364.          var4[var5] = var2[var5 - 1];
  365.       }
  366.  
  367.       var2 = var4;
  368.  
  369.       try {
  370.          return var3.newInstance(var2);
  371.       } catch (InvocationTargetException var6) {
  372.          if (var6.getTargetException() instanceof Error) {
  373.             throw (Error)var6.getTargetException();
  374.          } else if (var6.getTargetException() instanceof RuntimeException) {
  375.             throw (RuntimeException)var6.getTargetException();
  376.          } else {
  377.             throw new ThrownException(var6.getTargetException());
  378.          }
  379.       } catch (Exception var7) {
  380.          throw new CatchedExceptionError(var7, var1);
  381.       }
  382.    }
  383.  
  384.    public Method lookupMethod(Node var1, String var2, Class[] var3) throws NoSuchMethodException {
  385.       Class var4 = NodeProperties.getType(var1);
  386.       Method var5 = ReflectionUtilities.lookupMethod(var4, var2, var3);
  387.       this.setAccessFlag(var5);
  388.       if (var5.getName().equals("clone")) {
  389.          var5.setAccessible(true);
  390.       }
  391.  
  392.       return var5;
  393.    }
  394.  
  395.    public MethodDeclaration lookupFunction(String var1, Class[] var2) throws NoSuchFunctionException {
  396.       Iterator var3 = this.functions.iterator();
  397.       LinkedList var4 = new LinkedList();
  398.  
  399.       while(var3.hasNext()) {
  400.          MethodDeclaration var5 = (MethodDeclaration)var3.next();
  401.          if (var5.getName().equals(var1)) {
  402.             var4.add(var5);
  403.          }
  404.       }
  405.  
  406.       for(MethodDeclaration var11 : var4) {
  407.          List var6 = var11.getParameters();
  408.          if (var6.size() == var2.length) {
  409.             Class[] var7 = new Class[var6.size()];
  410.             Iterator var8 = var6.iterator();
  411.  
  412.             for(int var9 = 0; var8.hasNext(); var7[var9++] = NodeProperties.getType((Node)var8.next())) {
  413.             }
  414.  
  415.             if (ReflectionUtilities.hasCompatibleSignatures(var7, var2)) {
  416.                return var11;
  417.             }
  418.          }
  419.       }
  420.  
  421.       throw new NoSuchFunctionException(var1);
  422.    }
  423.  
  424.    public Method lookupSuperMethod(Node var1, String var2, Class[] var3) throws NoSuchMethodException {
  425.       throw new ExecutionError("super.method", var1);
  426.    }
  427.  
  428.    public Field getField(Class var1, String var2) throws NoSuchFieldException, AmbiguousFieldException {
  429.       Field var3 = ReflectionUtilities.getField(var1, var2);
  430.       this.setAccessFlag(var3);
  431.       return var3;
  432.    }
  433.  
  434.    public Field getSuperField(Node var1, String var2) throws NoSuchFieldException, AmbiguousFieldException {
  435.       throw new ExecutionError("super.field", var1);
  436.    }
  437.  
  438.    protected void setAccessFlag(Member var1) {
  439.       int var2 = var1.getModifiers();
  440.       Class var3 = var1.getDeclaringClass();
  441.       int var4 = var3.getModifiers();
  442.       String var5 = this.importationManager.getCurrentPackage();
  443.       String var6 = this.getPackageName(var3);
  444.       boolean var7 = var5.equals(var6);
  445.       if (Modifier.isPublic(var4) || var7) {
  446.          if (Modifier.isPublic(var2)) {
  447.             ((AccessibleObject)var1).setAccessible(true);
  448.          } else if (Modifier.isProtected(var2)) {
  449.             if (var7) {
  450.                ((AccessibleObject)var1).setAccessible(true);
  451.             }
  452.          } else if (!Modifier.isPrivate(var2) && var7) {
  453.             ((AccessibleObject)var1).setAccessible(true);
  454.          }
  455.       }
  456.  
  457.    }
  458.  
  459.    protected String getPackageName(Class var1) {
  460.       String var2 = var1.getName();
  461.       int var3 = var2.lastIndexOf(46);
  462.       return var3 == -1 ? "" : var2.substring(0, var3);
  463.    }
  464.  
  465.    // $FF: synthetic method
  466.    static Class class$(String var0) {
  467.       try {
  468.          return Class.forName(var0);
  469.       } catch (ClassNotFoundException var2) {
  470.          throw new NoClassDefFoundError(((Throwable)var2).getMessage());
  471.       }
  472.    }
  473.  
  474.    public GlobalContext(Interpreter var1) {
  475.       this.importationManager = new BufferedImportationManager(var1.getClassLoader());
  476.       this.interpreter = var1;
  477.    }
  478.  
  479.    public GlobalContext(Interpreter var1, ClassLoader var2) {
  480.       this.importationManager = new BufferedImportationManager(var2);
  481.       this.interpreter = var1;
  482.       this.classLoader = var2;
  483.    }
  484.  
  485.    public GlobalContext(Interpreter var1, Set var2) {
  486.       super(var2);
  487.       this.interpreter = var1;
  488.    }
  489.  
  490.    static {
  491.       OBJECT_ARRAY_ARRAY = new ArrayType(OBJECT_TYPE, 2);
  492.       OBJECT_CLASS = new TypeExpression(OBJECT_TYPE);
  493.       LOCALS = new FieldDeclaration(1, MAP_TYPE, "local$Variables$Reference$0", (Expression)null);
  494.       classCount = 0;
  495.    }
  496. }
  497.